Select pres dve tabulky

Otázka od: tomsir1.edu@mail.cez.cz

2. 10. 2002 16:32


Ahoj,

mam dve tabulky :

tab1 : id_osoby, jmeno
tab2 : id_osoby, id_zbozi,popis_zbozi

potrebuju udelat select pres obe tabulky tak aby mi dotaz vratil vypis
vsech osob z tab1 a jim odpovidajici polozky z tab2. V pripade, kdy v tab2
neexistuje odpovidajici polozka pro radek z tab1, potrebuji aby vysledkem
dotazu byl pouze obsah radku z tab1 doplneny o nulove hodnoty, nejak takto
:


id_osoby, jmeno, id_zbozi,
popis_zbozi

     1 Novak 1
vrtacka
     1 Novak 2
kladivo
     2 Novakova 0
     3 Trouba 1
vrtacka


atd ... doufam ze je to pochopitelny ...
Pripadne jak by to bylo pres tri tabulky ... napr. jeste by se dal
rozlisit dodavatel zbozi /s tim ze ho nekde nezadam/



Diky Radek



Odpovedá: ing. Jan Fiala

2. 10. 2002 13:56

Nepises, na jake databazi.
Zkus se podivat na klauzuli Left Outer Join. To by melo byt to, co
potrebujes.

--
ing. Jan Fiala
mailto:jan.fiala@iol.cz

2.10.2002 tomsir1.edu@mail.cez.cz:
> mam dve tabulky :

> tab1 : id_osoby, jmeno
> tab2 : id_osoby, id_zbozi,popis_zbozi

> potrebuju udelat select pres obe tabulky tak aby mi dotaz vratil vypis
> vsech osob z tab1 a jim odpovidajici polozky z tab2. V pripade, kdy v tab2
> neexistuje odpovidajici polozka pro radek z tab1, potrebuji aby vysledkem
> dotazu byl pouze obsah radku z tab1 doplneny o nulove hodnoty, nejak takto

Odpovedá: Ing. Jiri SOKOL

2. 10. 2002 14:17

> tab1 : id_osoby, jmeno
> tab2 : id_osoby, id_zbozi,popis_zbozi
>
> potrebuju udelat select pres obe tabulky tak aby mi dotaz vratil vypis
> vsech osob z tab1 a jim odpovidajici polozky z tab2. V pripade, kdy v tab2
> neexistuje odpovidajici polozka pro radek z tab1, potrebuji aby vysledkem
> dotazu byl pouze obsah radku z tab1 doplneny o nulove hodnoty, nejak takto
> :
>
>
> id_osoby, jmeno, id_zbozi,
> popis_zbozi
>
> 1 Novak 1
> vrtacka
> 1 Novak 2
> kladivo
> 2 Novakova 0
> 3 Trouba 1
> vrtacka
>

zkus tohle:

SELECT id_osoby, jmeno, id_zbozi, popis_zbozi FROM tab1, tab2 WHERE
tab1.id_osoby=tab2.id_osoby;
 
> atd ... doufam ze je to pochopitelny ...
> Pripadne jak by to bylo pres tri tabulky ... napr. jeste by se dal
> rozlisit dodavatel zbozi /s tim ze ho nekde nezadam/
>

se trema by to melo byt identicke:

SELECT id_osoby, jmeno, id_zbozi, popis_zbozi, id_dodavatele, nazev_dodavatele
FROM tab1, tab2,
 tab3 WHERE (tab1.id_osoby=tab2.id_osoby)AND(tab2.id_zbozi=tab3.id_zbozi);

kde je predpoklad existence tabulky: Tab3, ktera ma minimalne sloupce:
id_zbozi, id_dodavatele,
nazev_dodavatele.

>
> Diky Radek
>

Ahoj Jirka

Ing. Jiri Sokol, js-delphi@seznam.cz, +420251431187
D6ProfSP2,WinNT
amatersky
programator

______________________________________________________________________
Reklama:
Kam do kina ci divadla? http://kultura.seznam.cz

Odpovedá: ing. Jan Fiala

2. 10. 2002 13:29

2.10.2002 Ing. Jiri SOKOL:
>> tab1 : id_osoby, jmeno
>> tab2 : id_osoby, id_zbozi,popis_zbozi
>>
>> potrebuju udelat select pres obe tabulky tak aby mi dotaz vratil vypis
>> vsech osob z tab1 a jim odpovidajici polozky z tab2. V pripade, kdy v tab2
>> neexistuje odpovidajici polozka pro radek z tab1, potrebuji aby vysledkem
>> dotazu byl pouze obsah radku z tab1 doplneny o nulove hodnoty, nejak takto

> SELECT id_osoby, jmeno, id_zbozi, popis_zbozi FROM tab1, tab2 WHERE
tab1.id_osoby=tab2.id_osoby;

Tohle nevybere zaznamy, ktere nejsou v tab2, ale pouze ty, ktere jsou
v obou tabulkach. K tomu prave slouzi Left Outer Join

--
ing. Jan Fiala
mailto:jan.fiala@iol.cz

Odpovedá: Ludo Fulop

2. 10. 2002 12:59

SELECT *, (SELECT id_zbozi, popis_zbozi FROM tab2 WHERE
id_osoby=tab1.id_osoby) FROM tab1
Ludo Fulop

----- Original Message -----
From: <tomsir1.edu@mail.cez.cz>
To: <delphi-l@clexpert.cz>
Sent: Wednesday, October 02, 2002 11:17 AM
Subject: Select pres dve tabulky


>
> Ahoj,
>
> mam dve tabulky :
>
> tab1 : id_osoby, jmeno
> tab2 : id_osoby, id_zbozi,popis_zbozi
>
> potrebuju udelat select pres obe tabulky tak aby mi dotaz vratil vypis
> vsech osob z tab1 a jim odpovidajici polozky z tab2. V pripade, kdy v tab2
> neexistuje odpovidajici polozka pro radek z tab1, potrebuji aby vysledkem
> dotazu byl pouze obsah radku z tab1 doplneny o nulove hodnoty, nejak takto
> :
>
>
> id_osoby, jmeno, id_zbozi,
> popis_zbozi
>
> 1 Novak 1
> vrtacka
> 1 Novak 2
> kladivo
> 2 Novakova 0
> 3 Trouba 1
> vrtacka
>
>
> atd ... doufam ze je to pochopitelny ...
> Pripadne jak by to bylo pres tri tabulky ... napr. jeste by se dal
> rozlisit dodavatel zbozi /s tim ze ho nekde nezadam/
>
>
>
> Diky Radek
>
>
>
>

Odpovedá: Ludo Fulop

2. 10. 2002 14:03

----- Original Message -----
From: "Ing. Jiri SOKOL" <JS-delphi@seznam.cz>
> potrebuju udelat select pres obe tabulky tak aby mi dotaz vratil vypis
> vsech osob z tab1 a jim odpovidajici polozky z tab2. V pripade, kdy v tab2
> neexistuje odpovidajici polozka pro radek z tab1, potrebuji aby vysledkem
> dotazu byl pouze obsah radku z tab1 doplneny o nulove hodnoty, nejak takto

>> zkus tohle:
>> SELECT id_osoby, jmeno, id_zbozi, popis_zbozi FROM tab1, tab2 WHERE
tab1.id_osoby=tab2.id_osoby;

toto vsak nevrati obsah riadku z tab1, pre ktory nie je zaznam v tab2..
Ludo Fulop

Odpovedá: Aleš Kerner

2. 10. 2002 16:51

Myslim si, ze takhle to nepujde, ty nulove by se tam nevyskytly, musí to byt
myslim pres left join

SELECT id_osoby, jmeno, id_zbozi, popis_zbozi FROM tab1, tab2 WHERE
tab1.id_osoby=tab2.id_osoby;

SELECT id_osoby, jmeno, id_zbozi, popis_zbozi, id_dodavatele,
nazev_dodavatele FROM tab1, tab2,
 tab3 WHERE (tab1.id_osoby=tab2.id_osoby)AND(tab2.id_zbozi=tab3.id_zbozi);

tohle co uvadis je obdoba Inner Join


Ales

----- Original Message -----
From: "Ing. Jiri SOKOL" <JS-delphi@seznam.cz>
To: <delphi-l@clexpert.cz>
Sent: Wednesday, October 02, 2002 12:06 PM
Subject: Re: Select pres dve tabulky


> tab1 : id_osoby, jmeno
> tab2 : id_osoby, id_zbozi,popis_zbozi
>
> potrebuju udelat select pres obe tabulky tak aby mi dotaz vratil vypis
> vsech osob z tab1 a jim odpovidajici polozky z tab2. V pripade, kdy v tab2
> neexistuje odpovidajici polozka pro radek z tab1, potrebuji aby vysledkem
> dotazu byl pouze obsah radku z tab1 doplneny o nulove hodnoty, nejak takto
> :
>
>
> id_osoby, jmeno, id_zbozi,
> popis_zbozi
>
> 1 Novak 1
> vrtacka
> 1 Novak 2
> kladivo
> 2 Novakova 0
> 3 Trouba 1
> vrtacka
>

zkus tohle:

SELECT id_osoby, jmeno, id_zbozi, popis_zbozi FROM tab1, tab2 WHERE
tab1.id_osoby=tab2.id_osoby;

> atd ... doufam ze je to pochopitelny ...
> Pripadne jak by to bylo pres tri tabulky ... napr. jeste by se dal
> rozlisit dodavatel zbozi /s tim ze ho nekde nezadam/
>

se trema by to melo byt identicke:

SELECT id_osoby, jmeno, id_zbozi, popis_zbozi, id_dodavatele,
nazev_dodavatele FROM tab1, tab2,
 tab3 WHERE (tab1.id_osoby=tab2.id_osoby)AND(tab2.id_zbozi=tab3.id_zbozi);

kde je predpoklad existence tabulky: Tab3, ktera ma minimalne sloupce:
id_zbozi, id_dodavatele,
nazev_dodavatele.

>
> Diky Radek
>

Ahoj Jirka

Ing. Jiri Sokol, js-delphi@seznam.cz, +420251431187
D6ProfSP2,WinNT
amatersky
programator

______________________________________________________________________
Reklama:
Kam do kina ci divadla? http://kultura.seznam.cz


---
Odchozí zpráva neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.393 / Virová báze: 223 - datum vydání: 30.9.2002

Odpovedá: Lstiburek Pavel

2. 10. 2002 13:29

> Od: Ing. Jiri SOKOL [mailto:JS-delphi@seznam.cz]
> > tab1 : id_osoby, jmeno
> > tab2 : id_osoby, id_zbozi,popis_zbozi
> >
> > potrebuju udelat select pres obe tabulky tak aby mi dotaz
> vratil vypis
> > vsech osob z tab1 a jim odpovidajici polozky z tab2. V
> pripade, kdy v tab2
> > neexistuje odpovidajici polozka pro radek z tab1, potrebuji
> aby vysledkem
> > dotazu byl pouze obsah radku z tab1 doplneny o nulove
> hodnoty
> zkus tohle:
>
> SELECT id_osoby, jmeno, id_zbozi, popis_zbozi FROM tab1, tab2
> WHERE tab1.id_osoby=tab2.id_osoby;
>
> > atd ... doufam ze je to pochopitelny ...
> > Pripadne jak by to bylo pres tri tabulky ... napr. jeste by se dal
> > rozlisit dodavatel zbozi /s tim ze ho nekde nezadam/
> >
>
> se trema by to melo byt identicke:
>
> SELECT id_osoby, jmeno, id_zbozi, popis_zbozi, id_dodavatele,
> nazev_dodavatele FROM tab1, tab2,
> tab3 WHERE
> (tab1.id_osoby=tab2.id_osoby)AND(tab2.id_zbozi=tab3.id_zbozi);
>
> kde je predpoklad existence tabulky: Tab3, ktera ma minimalne
> sloupce: id_zbozi, id_dodavatele,
> nazev_dodavatele.
>
Bohuzel vysledek takto definovaneho dotazu vrazi pouze radky ktere vyhovuji
podmince a ostatni "zmizi".
Dotaz je treba napsat:
SELECT ... FROM tab1 LEFT OUTER JOIN tab2 ON tab1.id_osoby=tab2.id_osoby
                    
Pro tri tabulky jsou dve moznosti (nejsou ale stejné!):
Pokud vypadaji relace:
a) tab1->tab2->tab3
SELECT ...
   FROM tab1 LEFT OUTER JOIN tab2
              LEFT OUTER JOIN tab3 ON tab2.id_zbozi = tab3.Id_zbozi ON
tab1.id_osoby=tab2.id_osoby
                    
b) tab1-->tab2
       +->tab3
SELECT ... FROM tab1 LEFT OUTER JOIN tab2 ON tab1.id_osoby=tab2.id_osoby
LEFT OUTER JOIN tab3 ON tab1.id_zbozi = tab3.Id_zbozi

PS: tu podminku pro pripojeni tab3 jsem si vymyslel !

Jinak doporucuji nejakou liteteraturu k SQL, nekde jsem mel v ruce
"Kapesniho pruvodce SQL" (nebo tak nejak), je to strucne a je tam "skoro"
vse o beznem SQL. To na co se ptas jsou "uplne" zaklady.

Pavel

Odpovedá: tomsir1.edu@mail.cez.cz

2. 10. 2002 17:08


Dik.
Sice to jsou "uplne" zaklady, ale jak vidis dle odezvy, tak nejen ja
/zacatecnik/ v tom nemam jasno. Vlastnim knihu Naucte se MySQL za 21 dni,
ale z popisu tam jsem moc moudry nebyl. Asi jsem to cetl malokrat ...

Radek





Lstiburek Pavel <Lstiburek@ceb.cz>@clexpert.cz on 02.10.2002 13:35:21

Odpovězte prosím - delphi-l@clexpert.cz

Odesláno kým: delphi-l-owner@clexpert.cz


Komu: "'delphi-l@clexpert.cz'" <delphi-l@clexpert.cz>
Kopie:
Předmět: RE: Select pres dve tabulky


> Od: Ing. Jiri SOKOL [mailto:JS-delphi@seznam.cz]
> > tab1 : id_osoby, jmeno
> > tab2 : id_osoby, id_zbozi,popis_zbozi
> >
> > potrebuju udelat select pres obe tabulky tak aby mi dotaz
> vratil vypis
> > vsech osob z tab1 a jim odpovidajici polozky z tab2. V
> pripade, kdy v tab2
> > neexistuje odpovidajici polozka pro radek z tab1, potrebuji
> aby vysledkem
> > dotazu byl pouze obsah radku z tab1 doplneny o nulove
> hodnoty
> zkus tohle:
>
> SELECT id_osoby, jmeno, id_zbozi, popis_zbozi FROM tab1, tab2
> WHERE tab1.id_osoby=tab2.id_osoby;
>
> > atd ... doufam ze je to pochopitelny ...
> > Pripadne jak by to bylo pres tri tabulky ... napr. jeste by se dal
> > rozlisit dodavatel zbozi /s tim ze ho nekde nezadam/
> >
>
> se trema by to melo byt identicke:
>
> SELECT id_osoby, jmeno, id_zbozi, popis_zbozi, id_dodavatele,
> nazev_dodavatele FROM tab1, tab2,
> tab3 WHERE
> (tab1.id_osoby=tab2.id_osoby)AND(tab2.id_zbozi=tab3.id_zbozi);
>
> kde je predpoklad existence tabulky: Tab3, ktera ma minimalne
> sloupce: id_zbozi, id_dodavatele,
> nazev_dodavatele.
>
Bohuzel vysledek takto definovaneho dotazu vrazi pouze radky ktere vyhovuji
podmince a ostatni "zmizi".
Dotaz je treba napsat:
SELECT ... FROM tab1 LEFT OUTER JOIN tab2 ON tab1.id_osoby=tab2.id_osoby

Pro tri tabulky jsou dve moznosti (nejsou ale stejné!):
Pokud vypadaji relace:
a) tab1->tab2->tab3
SELECT ...
   FROM tab1 LEFT OUTER JOIN tab2
              LEFT OUTER JOIN tab3 ON tab2.id_zbozi = tab3.Id_zbozi ON
tab1.id_osoby=tab2.id_osoby

b) tab1-->tab2
       +->tab3
SELECT ... FROM tab1 LEFT OUTER JOIN tab2 ON tab1.id_osoby=tab2.id_osoby
LEFT OUTER JOIN tab3 ON tab1.id_zbozi = tab3.Id_zbozi

PS: tu podminku pro pripojeni tab3 jsem si vymyslel !

Jinak doporucuji nejakou liteteraturu k SQL, nekde jsem mel v ruce
"Kapesniho pruvodce SQL" (nebo tak nejak), je to strucne a je tam "skoro"
vse o beznem SQL. To na co se ptas jsou "uplne" zaklady.

Pavel



Odpovedá: Votava

2. 10. 2002 17:48

SELECT tab1.id_osoby,tab1.jmeno,tab2.id_zbozi,tab2.popis_zbozi FROM tab1
LEFT OUTER JOIN tab2 on tab1.id_osoby=tab2.id_osoby

s pozdravem Votava
>
> Ahoj,
>
> mam dve tabulky :
>
> tab1 : id_osoby, jmeno
> tab2 : id_osoby, id_zbozi,popis_zbozi
>
> potrebuju udelat select pres obe tabulky tak aby mi dotaz vratil vypis
> vsech osob z tab1 a jim odpovidajici polozky z tab2. V pripade, kdy v tab2
> neexistuje odpovidajici polozka pro radek z tab1, potrebuji aby vysledkem
> dotazu byl pouze obsah radku z tab1 doplneny o nulove hodnoty, nejak takto
> :
>
>
> id_osoby, jmeno, id_zbozi,
> popis_zbozi
>
> 1 Novak 1
> vrtacka
> 1 Novak 2
> kladivo
> 2 Novakova 0
> 3 Trouba 1
> vrtacka
>
>
> atd ... doufam ze je to pochopitelny ...
> Pripadne jak by to bylo pres tri tabulky ... napr. jeste by se dal
> rozlisit dodavatel zbozi /s tim ze ho nekde nezadam/
>
>
>
> Diky Radek
>
>
>
>
>

Odpovedá: David Michal

2. 10. 2002 14:31

select A.vse_co_chces_z_tab1, B.co_chces_z_tab2 From
tab1 A Left Outer Join tab2 B on (A.ID_Osoby = B.ID_Osoby)

David

----- Original Message -----
From: "Ing. Jiri SOKOL" <JS-delphi@seznam.cz>
> potrebuju udelat select pres obe tabulky tak aby mi dotaz vratil vypis
> vsech osob z tab1 a jim odpovidajici polozky z tab2. V pripade, kdy v tab2
> neexistuje odpovidajici polozka pro radek z tab1, potrebuji aby vysledkem
> dotazu byl pouze obsah radku z tab1 doplneny o nulove hodnoty, nejak takto

>> zkus tohle:
>> SELECT id_osoby, jmeno, id_zbozi, popis_zbozi FROM tab1, tab2 WHERE
tab1.id_osoby=tab2.id_osoby;

toto vsak nevrati obsah riadku z tab1, pre ktory nie je zaznam v tab2..
Ludo Fulop


---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.391 / Virus Database: 222 - Release Date: 19/09/2002

Odpovedá: Lstiburek Pavel

4. 10. 2002 12:32

Ty "uplne" zaklady nebyly mysleny nijak spatne, pouze jsem chtel tim rici,
ze je to mozne snadno nastudovat (a je to obecne pro libovolne SQL dotazy).
Velmi dobra je kniha "Mistrovstvi v Transact SQL", ta je, ale hodne
orientoana na MS SQL. Pomines-li jazyk T-SQL, ktery je internim jazykem SQL
serveru Microsoftu, tak 2/3 knihy jsou o zakladnich prikazech SQL = SELECT,
INSERT, UPDATE a DELETE, ktere respektuji doporuceni ISO (samozrejme s
odchylkami, jako u kazdeho velkeho dodavatele). Ja MySql nepouzivam, ale co
jsem slysel a cetl, tak vlastni DML je velmi blizke doporuceni ISO.

Pavel

> Dik.
> Sice to jsou "uplne" zaklady, ale jak vidis dle odezvy, tak nejen ja
> /zacatecnik/ v tom nemam jasno. Vlastnim knihu Naucte se
> MySQL za 21 dni,
> ale z popisu tam jsem moc moudry nebyl. Asi jsem to cetl malokrat ...
>
> Radek